package com.suiwei.advanced.collection;

import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;

//List接口：存取有序；有索引；可以存储重复数据
//实现类：ArrayList，LinkedList
public class ListDemo {
    @Test
    void listTest() {
        List<String> list = new ArrayList<>();
        //添加
        list.add("第一");
        list.add(0, "插队"); // 在指定所引处插入元素；
        //删除
        String remove = list.remove(1);// 根据索引做删除，并返回删除的元素（一般不接收）
        list.remove("插队"); // 根据元素做删除,只会删除第一个匹配的
        //修改
        String set = list.set(0, "修改");//根据索引做修改，返回被覆盖的元素（一般不接收）
        // 查询
        System.out.println(list.get(0));
        System.out.println(list.size());
        System.out.println("是否为空："+list.isEmpty());//只判断数组元素是否为空；如果是null则报错
        System.out.println(list.contains("插队"));//是否包含给定元素
        //清空
        list.clear();
    }
    //遍历
    //除了通用的三种遍历方法外，还有独有的两种
    @Test
    void listTest1() {
        List<String> list = new ArrayList<>();
        list.add("第一");
        list.add("第二");
        //1.普通for循环(List有索引，所以可以用普通for循环)
        for (int i = 0; i < list.size(); i++) {
            list.get(i);
        }
        //2.ListIterator（List集合独有的迭代器）
        ListIterator<String> it = list.listIterator();
        //正序遍历
        while (it.hasNext()){
            if (it.next().equals("第二")) {
                list.remove("第二");//迭代器遍历过程中，不允许操作集合对象的添加删除
                it.remove();//可以用迭代器的remove方法
                it.add("第三");
            }

        }
        //倒序遍历，很少用
        //必须先正序遍历之后，指针到了后面，才能进行倒序遍历（指针一开始在0索引处）
        while (it.hasPrevious()){
            it.previous();
        }


    }

    //首尾增删特别快，所以有很多针对首尾的操作
    @Test
    void LinkedListTest() {
        LinkedList<String> test = new LinkedList<>();
        test.addFirst("first");
        test.addLast("last");

        test.getFirst();
        test.getLast();

        test.removeFirst();
        test.removeLast();
        //LinkedList类,实现了List接口，所以也是有序的，有索引的，只是索引操作比ArrayList慢而已
        //根据索引查找：先判断索引离着头近还是尾近，再从头或者尾开始挨着查找
        test.get(1);

    }
}
